(function () {
  // 1.定义一个表示人的类
  class Person {
    name: string;
    age: number;
    constructor(name: string, age: number) {
      this.name = name;
      this.age = age;
    }
  }

  const per = new Person("猴子", 20);

  // 现在的属性是在对象中设置的 属性可以任意被修改
  per.name = "小陈";
  per.age = -100; // 存在隐患
  console.log(per);

  // 2.如果我们不想属性被修改怎么办呢? 通过private关键字定义私有属性 默认都是public
  // 如下
  class Person2 {
    public name: string;
    // 只能在类中使用
    private _age: number;
    constructor(name: string, age: number) {
      this.name = name;
      this._age = age;
    }
    // 如果我们实在想获取私有属性 我们可以自己提供一个方法暴露出去
    getAge() {
      return this._age;
    }
    // 修改同理 提供一个修改方法即可 是可控的
  }

  const per2 = new Person2("小陈", 20);
  // per2._age = 100; // 只能在类中使用 私有属性
  console.log(per2);
  console.log(per2.getAge());


  // 3.如果我不想通过方法获取或者更改属性怎么办
  // 我们可以在类中添加getter/setter方法 外部可以直接通过属性获取
  class Person3 {
    private _name: string;
    get name() {
      return this._name;
    }

    set name(value) {
      this._name = value;
    }
    constructor(name: string) {
      this._name = name;
    }
  }
  const per3 = new Person3("小陈");
  per3.name = "小测试";
  console.log(per3.name);

  // 4.子类不能访问父类的私有属性 但是可以访问protected(受保护的属性)

  // 5.省略构造函数赋值过程
  class C {
    // 语法糖
    constructor(public name: string, public age: number) { }
  }

  const c = new C("测试", 20);
  console.log(c);

  // 总结: 类的私有属性怎么说呢?
  // ps: 就好比我有100块钱, 这个是我的钱, 我不可能今天我有100块, 明天你给我用了10块, 啪我看一下 诶 就剩90了, 是吧? 也就是说如果
  // 我不跟你说, 你就不知道我有多少钱, 其次, 我不知情的情况下你动不了我的钱, 除非通过我的同意, 你才能使用, 也就是正如上面的例子一样
  // 就是我可以给提供给你(自己掌控 风险可控), 但是你不能自己瞎搞, 懂嘛?
})()